package com.demo.threaddemo;

/**
 * 死锁demo
 * @author xiangty
 *
 * 死锁的定义:
 *		所谓死锁是指多个线程因竞争资源而造成的一种僵局（互相等待），若无外力作用，这些进程都将无法向前推进。
 *		所谓死锁是指两个或两个以上的线程在执行过程中，因争夺资源而造成的一种互相等待的现象，若无外力作用，它们都将无法推进下去。
 *
 *下面我们通过一些实例来说明死锁现象:
 *     先看生活中的一个实例，两个人面对面过独木桥，甲和乙都已经在桥上走了一段距离，即占用了桥的资源，
 *     甲如果想通过独木桥的话，乙必须退出桥面让出桥的资源，让甲通过，但是乙不服，为什么让我先退出去，我还想先过去呢，
 *     于是就僵持不下，导致谁也过不了桥，这就是死锁。
 *
 */
public class DeadLock {
	static Object objA = new Object();
	static Object objB = new Object();
	
	public static void main(String[] args) {
		// 线程1
		new Thread(()->{
			try {
				synchronized (objA) {
					System.out.println(Thread.currentThread().getName() + "get objA");
					Thread.sleep(1000);
					synchronized (objB) {
						System.out.println(Thread.currentThread().getName() + "get objB");
					}
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}, "thread-1").start();
		
		
		// 线程2
		new Thread(()->{
			try {
				synchronized (objB) {
					System.out.println(Thread.currentThread().getName() + "get objB");
					Thread.sleep(1000);
					synchronized (objA) {
						System.out.println(Thread.currentThread().getName() + "get objA");
					}
				}
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}, "thread-2").start();
		
	}
}
